package steffen;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import marja.KundenArchiv;

/**
 * Klasse, die viele statische Hilfsfunktionen bereitstellt, um diese im gesamten Projekt nutzen zu können.
 * 
 * @author Steffen Krüger
 * @version 1.0
 */
public class Functions
{
    /**
     * Funktion um Datum zu prüfen
     * 
     * @author Steffen Krüger
     * @param String
     *            zu überprüfendes Datum
     * @throws ParseException
     * @return String
     *            übergebenes Datum
     */
    public static String prüfeDatum(String datum) throws ParseException
    {
        SimpleDateFormat df = new SimpleDateFormat("dd.MM.yy-HH:mm");
        df.setLenient(false);
        return df.format(df.parse(datum));
    }
    
    /**
     * Funktion um ein Kunden zu ermitteln
     * 
     * @author Steffen Krüger
     * @throws WSVException 
     */
    public static int kundenEingeben() throws WSVException
    {
    	String vorname 	= stringEingeben("Bitte geben Sie den Vornamen des Kunden ein: ");
    	String nachname = stringEingeben("Bitte geben Sie den Nachnamen des Kunden ein: ");
    	
    	return KundenArchiv.getInstance().bekommeIndex(vorname, nachname);
    }
    
    /**
     * Funktion Namen in der Batch zu verarbeiten
     * 
     * @author Steffen Krüger
     * @throws WSVException 
     */
    public static String[] verarbeiteNamen(String name) throws WSVException
    {
    	String[] namen = name.split("#");
        prüfeArrayLänge(
        		2, 
        		namen, 
        		2, 
        		"Kein Kundenname im Format Vorname#Nachname gefunden.",
                "Kein Kundenname im Format Vorname#Nachname gefunden."
        		);
    	
    	return namen;
    }

    /**
     * Funktion um ein Datum einzugeben und zu prüfen
     * 
     * @author Steffen Krüger
     * @param String
     *            Ausgabe vor der Abfrage
     */
    public static String datumEingeben(String strAbfrage)
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true)
        {
            System.out.print(strAbfrage);
            String line = null;

            try
            {
                line = br.readLine();
            } catch (IOException e)
            {

            }

            try
            {
                return prüfeDatum(line);
            } catch (ParseException e)
            {
            }

            System.out.println("\nBitte geben Sie ein gültiges Datum im Format \"dd.MM.yy‐HH:mm\" ein.");
        }
    }

    /**
     * Funktion um ein boolean einzugeben und zu prüfen
     * 
     * @author Steffen Krüger
     * @param String
     *            Ausgabe vor der Abfrage
     */
    public static boolean boolEingeben(String strAbfrage)
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true)
        {
            System.out.print(strAbfrage);
            String line = null;

            try
            {
                line = br.readLine();
            } catch (IOException e)
            {

            }

            if (line.equalsIgnoreCase("y"))
            {
                return true;
            } else
            {
                if (line.equalsIgnoreCase("n"))
                {
                    return false;
                }
            }

            System.out.println("\nBitte geben Sie ein 'y' oder 'n' ein.");
        }
    }

    /**
     * Funktion um einen String einzugeben und zu prüfen
     * 
     * @author Steffen Krüger
     * @param String
     *            Ausgabe vor der Abfrage
     */
    public static String stringEingeben(String strAbfrage)
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true)
        {
            System.out.print(strAbfrage);
            String line = null;

            try
            {
                line = br.readLine();
                return new String(line.getBytes(Charset.forName("ISO-8859-1")));
            } catch (IOException e)
            {

            }
        }
    }

    /**
     * Funktion um einen Integer einzugeben und zu prüfen
     * 
     * @author Steffen Krüger
     * @param String
     *            strAbfrage Ausgabe vor der Abfrage
     */
    public static int intEingeben(String strAbfrage)
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true)
        {
            System.out.print(strAbfrage);

            String line = null;
            try
            {
                line = br.readLine();
            } catch (IOException e)
            {

            }

            try
            {
                int integer = Integer.parseInt(line);
                if (integer >= 0)
                {
                    return integer;
                }
            } catch (NumberFormatException e)
            {
            }

            System.out.println("Bitte geben Sie eine gültige Zahl größer oder gleich 0 ein.");
        }
    }

    /**
     * Prüfe Array Länge
     * 
     * @author Steffen Krüger
     * @param int Mindestlänge
     * @param StringArray
     * @throws WSVException 
     */
    public static void prüfeArrayLänge(int minAnzahl, String[] Array) throws WSVException
    {
        if (Array.length < minAnzahl)
        {
            throw new WSVException("Zuviele / zuwenige Datenargumente", 3);
        }
    }

    /**
     * Prüfe Array Länge
     * 
     * @author Steffen Krüger
     * @param int Mindestlänge
     * @param String
     * @param String
     *            fehlermeldung
     * @throws WSVException 
     */
    public static void prüfeArrayLänge(int minAnzahl, String[] Array, String fehlermeldung) throws WSVException
    {
        if (Array.length < minAnzahl)
        {
            throw new WSVException(fehlermeldung, 3);
        }
    }

    /**
     * Prüfe Array Länge
     * 
     * @author Steffen Krüger
     * @param int Mindestlänge
     * @param String
     * @param Maximallänge
     * @throws WSVException 
     */
    public static void prüfeArrayLänge(int minAnzahl, String[] Array, int max) throws WSVException
    {
        if (Array.length < minAnzahl)
        {
            throw new WSVException("Zu wenige Argumente", 3);
        }

        if (Array.length > max)
        {
            throw new WSVException("Zu viele Argumente", 3);
        }
    }

    /**
     * Prüfe Array Länge
     * 
     * @author Steffen Krüger
     * @param Integer
     *            Mindestlänge
     * @param String
     * @param Integer
     *            maximallänge
     * @param String
     *            Fehler bei zu vielen Elementen im Array
     * @param String
     *            Fehler bei zu wenigen Elementen im Array
     * @throws WSVException 
     */
    public static void prüfeArrayLänge(int minAnzahl, String[] Array, int max, String zuVieleArgumente, String zuWenigeArgumente) throws WSVException
    {
        if (Array.length < minAnzahl)
        {
            throw new WSVException(zuWenigeArgumente, 3);
        }

        if (Array.length > max)
        {
            throw new WSVException(zuVieleArgumente, 3);
        }
    }
}
